home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok77.lha / IFFlib / IFFlib.lha / Examples / EasyExample.c < prev    next >
C/C++ Source or Header  |  1992-06-14  |  4KB  |  169 lines

  1. /*
  2. **
  3. **    $Id: EasyExample.c,v 21.2 92/06/02 18:08:10 chris Exp $
  4. **    $Revision: 21.2 $
  5. **
  6. **    $Filename: Examples/EasyExample.c $
  7. **    $Author: chris $
  8. **    $Release: 21.1 $
  9. **    $Date: 92/06/02 18:08:10 $
  10. **
  11. **    A simple ILBM file viewer. To compile with Lattice C 5.x, just
  12. **    type 'lmk'. For other compilers you may have to do minor changes.
  13. **
  14. **    THIS IS PD. NO WARRANTY. USE AT YOUR OWN RISK.
  15. **
  16. */
  17.  
  18. #include <proto/exec.h>
  19. #include <proto/graphics.h>
  20. #include <graphics/gfxbase.h>
  21. #include <proto/intuition.h>
  22. #include <dos/dos.h>
  23.  
  24. #include <stdio.h>
  25. #include <string.h>
  26.  
  27. /*
  28. **    If you don't want to put non-Commodore files in the standard
  29. **    include directories, use the SASCOptions program to add the place
  30. **    where you store those non-standard files to your include path.
  31. */
  32. #include <libraries/iff.h>
  33.  
  34. struct Library *IntuitionBase, *IFFBase;
  35. struct GfxBase *GfxBase;
  36.  
  37. /****************************************************************************
  38. **    Adjust the screen position for overscan pictures in an OS 1.3 compatible
  39. **    way. There are more clever ways to do this under Kickstart 2.x, so you
  40. **    may want to modify this code.
  41. */
  42.  
  43. void SetOverscan(struct Screen *screen)
  44. {
  45.     WORD cols, rows, x=screen->Width, y=screen->Height;
  46.     struct ViewPort    *vp = &(screen->ViewPort);
  47.  
  48.     cols = GfxBase->NormalDisplayColumns>>1;
  49.     rows = GfxBase->NormalDisplayRows; if(rows>300) rows>>=1;
  50.     x -= cols; if(vp->Modes & HIRES) x -= cols;
  51.     y -= rows; if(vp->Modes & LACE)  y -= rows;
  52.     x >>=1; if(x<0) x=0; y >>=1; if(y<0) y=0; if(y>32) y=32;
  53.  
  54.     /*
  55.     **    To avoid color distortions in HAM mode, we must limit the
  56.     **    left edge of the screen to the leftmost value the hardware
  57.     **    can display.
  58.     */
  59.     if(vp->Modes & HAM)
  60.     {
  61.         if(GfxBase->ActiView->DxOffset-x < 96)
  62.             x = GfxBase->ActiView->DxOffset-96;
  63.     }
  64.     vp->DxOffset = -x; vp->DyOffset = -y;
  65.     MakeScreen(screen);
  66.     RethinkDisplay();
  67. }
  68.  
  69. /****************************************************************************
  70. **    Load an IFF file and if it's an ILBM, display the picture on a screen
  71. */
  72.  
  73. void DisplayILBM(char *filename)
  74. {
  75.     IFFL_HANDLE iff;
  76.  
  77.     if(iff = IFFL_OpenIFF(filename, IFFL_MODE_READ) )
  78.     {
  79.         struct IFFL_BMHD *bmhd;
  80.  
  81.         if(bmhd = IFFL_GetBMHD(iff) )
  82.         {
  83.             struct Screen        *myscreen;
  84.             struct NewScreen    ns;
  85.  
  86.             memset(&ns, 0, sizeof(ns) );
  87.  
  88.             ns.Type            = CUSTOMSCREEN | SCREENQUIET | SCREENBEHIND;
  89.             ns.Width        = bmhd->w;
  90.             ns.Height        = bmhd->h;
  91.             ns.Depth        = bmhd->nPlanes;
  92.             ns.ViewModes    = IFFL_GetViewModes(iff);
  93.  
  94.             if(myscreen = OpenScreen(&ns) )
  95.             {
  96.                 LONG  count;
  97.                 UWORD colortable[256];
  98.  
  99.                 SetOverscan(myscreen);
  100.  
  101.                 count = IFFL_GetColorTab(iff, colortable);
  102.  
  103.                 /* Fix for old broken HAM pictures */
  104.                 if(count>32L) count = 32L;
  105.  
  106.                 LoadRGB4(&(myscreen->ViewPort), colortable, count);
  107.  
  108.                 printf("Press Ctrl-C to quit.\n");
  109.  
  110.                 if(IFFL_DecodePic(iff, &myscreen->BitMap) )
  111.                 {
  112.                     ScreenToFront(myscreen);
  113.                     Wait(SIGBREAKF_CTRL_C);
  114.                 }
  115.                 else printf("Can't decode picture.\n");
  116.  
  117.                 CloseScreen(myscreen);
  118.             }
  119.             else printf("Can't open screen.\n");
  120.         }
  121.         else printf("This file has no bitmap header.\n");
  122.  
  123.         IFFL_CloseIFF(iff);
  124.     }
  125.     else printf("Can't open file '%s'\n",filename);
  126. }
  127.  
  128. /****************************************************************************
  129. **    Main program
  130. */
  131.  
  132. LONG main(int argc, char **argv)
  133. {
  134.     /*
  135.     **    Check command line args
  136.     */
  137.     if((argc != 2) || !strcmp(argv[1],"?") )
  138.     {
  139.         printf("Usage: %s <filename>\n",argv[0]);
  140.         return RETURN_FAIL;
  141.     }
  142.  
  143.     /*
  144.     **    Open the libraries we need
  145.     */
  146.     if(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L) )
  147.     {
  148.         if(IntuitionBase = OpenLibrary("intuition.library", 0L) )
  149.         {
  150.             if(IFFBase = OpenLibrary(IFFNAME, IFFVERSION) )
  151.             {
  152.                 DisplayILBM(argv[1]);
  153.  
  154.                 printf("IFFL_IFFError value is %ld\n", IFFL_IFFError() );
  155.  
  156.                 CloseLibrary(IFFBase);        /* THIS IS VERY IMPORTANT! */
  157.             }
  158.             else printf("Can't open iff.library V%ld+\n", IFFVERSION);
  159.  
  160.             CloseLibrary(IntuitionBase);
  161.         }
  162.  
  163.         CloseLibrary((struct Library *)GfxBase);
  164.     }
  165.  
  166.     return RETURN_OK;
  167. }
  168.  
  169.